import {uuid} from './code';

/**
 * 序列化对象,但无法再序列化后拿回对象引用
 * @param {Object} obj 将对象序列化为字符串(包括函数)
 */
function serialize(obj) {
    let serStr = '';
    function serializeInternal(o, path) {
        for(let p in o) {
            let value = o[p];
            if(typeof value != "object") {
                if(typeof value == "string") {
                    serStr += "\n" + path + "[" + (isNaN(p) ? "\"" + p + "\"" : p) + "] = " + "\"" + value.replace(/\"/g, "\\\"") + "\"" + ";";
                } else {
                    serStr += "\n" + path + "[" + (isNaN(p) ? "\"" + p + "\"" : p) + "] = " + value + ";";
                }
            } else {
                if(value instanceof Array) {
                    serStr += "\n" + path + "[" + (isNaN(p) ? "\"" + p + "\"" : p) + "]" + "=" + "new Array();";
                    serializeInternal(value, path + "[" + (isNaN(p) ? "\"" + p + "\"" : p) + "]");
                } else {
                    serStr += "\n" + path + "[" + (isNaN(p) ? "\"" + p + "\"" : p) + "]" + "=" + "new Object();";
                    serializeInternal(value, path + "[" + (isNaN(p) ? "\"" + p + "\"" : p) + "]");
                }
            }
        }
    }
    serializeInternal(obj, 'deserializeObj');
    return toJson({
    	serJsonObj: toJson(obj),
    	serStr: serStr
    });
}

/**
 * 反序列化
 * @param {Object} serializeStr 由序列化方法生成的子串
 */
function deserialize(serializeObj) {
	let deserializeObj = serializeObj.serJsonObj || {};
	console.log(serializeObj.serStr)
	eval(serializeObj.serStr);
	return deserializeObj;
}

/**
 * 对象克隆
 * @param {Object} obj
 */
function clone(obj) {
	let _className = function(o) {
		if(o === null) return "Null";
		if(o === undefined) return "Undefined";
		return Object.prototype.toString.call(o).slice(8, -1);
	}
	let result, oClass = _className(obj);
	//确定result的类型
	if(oClass === "Object") {
		result = {};
	} else if(oClass === "Array") {
		result = [];
	} else {
		return obj;
	}
	for(let key in obj) {
		let copy = obj[key];
		if(_className(copy) == "Object" || _className(copy) == "Array") {
			result[key] = clone(copy); //递归调用
		} else {
			result[key] = obj[key];
		}
	}
	return result;
}

/**
 * 对象深度合并
 * @param {Object} obj1
 * @param {Object} obj2
 */
function merge(obj1={}, obj2={}) {
	let _obj1 = clone(obj1);
	let _obj2 = clone(obj2);
	let key;
	for(key in _obj2) _obj1[key] = _obj1[key] && _obj1[key].toString() === "[object Object]" ? merge(_obj1[key], _obj2[key]) : _obj1[key] = _obj2[key];
	return _obj1;
}

/**
 * 获取对象唯一引用
 * @param {Object} obj
 */
function ref(obj) {
	// 获取对象的唯一引用
	switch(obj) {
		case undefined:
			return 'undefined';
		case null:
			return 'null';
		case true:
			return 'true';
		case false:
			return 'false';
		default:
			switch(typeof obj) {
				case 'number': // 数字带有number前缀 
					return 'number:' + obj;
				case 'string': // 字符串带有string前缀 
					return 'string:' + obj;
				default:
					let refKey = '__ref__key__';
					if(!obj.hasOwnProperty(refKey)) {
						obj[refKey] = uuid();
					}
					return '@:' + obj[refKey];
			}
	}
}

/**
 * 对象比较
 * @param {Object} obj1
 * @param {Object} obj2
 */
function equals(obj1, obj2) {
	return ref(obj1) === ref(obj2);
}

/**
 * 对象转化为json字符串
 * @param {Object} obj
 */
function toJson(obj) {
	return JSON.stringify(obj);
}

/**
 * json字符串转化为对象
 * @param {String} jsonStr
 */
function fromJson(jsonStr) {
	if(jsonStr === undefined) {
		return undefined;
	}
	if(jsonStr === '') {
		return jsonStr;
	}
	return JSON.parse(jsonStr);
}

/**
 * 剔除字符串首尾空白
 * @param {String} str
 */
function trim(str) {
	if(!str) {
		return str;
	}
	return str.replace(/^\s*/g, '').replace(/\s*$/g, '');
}

function trimHtmlTag(str) {
	if(!str) {
		return str;
	}
	return str.replace(/<[^>]+>/g, '');
}

/**
 * 求最大公约数
 * @param {Number} m
 * @param {Number} n
 */
function gcd(m, n) {
	let u = m;
	let v = n;
	let t = v;
	while(v != 0) {
		t = u % v;
		u = v;
		v = t;
	}
	return u
}

/**
 * 小数转分式
 * @param {Number} decimal
 */
function dtf(decimal) {
	if(!decimal) {
		return undefined;
	}
	let decimalStr = decimal + '';
	decimalStr = decimalStr.replace(/^.+\./g, '');
	if(!decimalStr) {
		return undefined;
	}
	let zeroCount = decimalStr.length;
	let denominatorStr = '1';
	for(let i = 0; i < zeroCount; i++) {
		denominatorStr += '0';
	}
	let molecular = Number((decimal + '').replace('.', ''));
	let denominator = Number(denominatorStr);
	let gcdNum = gcd(molecular, denominator);
	return(molecular / gcdNum) + '/' + (denominator / gcdNum);
}

/**
 * 日期格式化:
 * @param {String} expression
 * 		yyyy: 年
 * 		MM: 月份 
 * 		dd: 日
 * 		HH: 小时 
 * 		mm: 分钟 
 * 		ss: 秒 
 * 		S: 毫秒
 * 		q: 季度
 * 	例如: yyyy-MM-dd HH:mm:ss:SS
 * @param {Date} date
 */
function dateFormat(expression, date) {
	let o = {
		yyyy: date.getFullYear(), // 年
		MM: date.getMonth() + 1, // 月份
		dd: date.getDate(), // 日
		HH: date.getHours(), // 小时
		mm: date.getMinutes(), // 分
		ss: date.getSeconds(), // 秒
		q: Math.floor((date.getMonth() + 3) / 3), // 季度
		S: date.getMilliseconds() // 毫秒
	};
	let _replace = function(str) {
		expression = expression.replace(str, o[str]);
	}
	let strs = ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'S', 'q'];
	for(let i = 0; i < strs.length; i++) {
		_replace(strs[i]);
	}
	return expression;
}

/**
 * yyyy-MM-dd HH:mm:ss:SS格式转Date
 * @param {Object} dateStr
 */
function toDate(dateStr) {
	// 从格式化子串获取日期
	var date = new Date();
	var cut = function(start, end) {
		var res = null;
		return parseInt(dateStr.substring(start, end), 10);
	};
	if(cut(0, 4)) {
		date.setYear(cut(0, 4));
	} else {
		date.setYear(0);
	}
	if(cut(5, 7)) {
		date.setMonth(cut(5, 7) - 1);
	} else {
		date.setMonth(0);
	}
	if(cut(8, 10)) {
		date.setDate(cut(8, 10));
	} else {
		date.setDate(0);
	}
	if(cut(11, 13)) {
		date.setHours(cut(11, 13));
	} else {
		date.setHours(0);
	}
	if(cut(14, 16)) {
		date.setMinutes(cut(14, 16));
	} else {
		date.setMinutes(0);
	}
	if(cut(17, 19)) {
		date.setSeconds(cut(17, 19));
	} else {
		date.setSeconds(0);
	}
	if(cut(20, 22)) {
		date.setMilliseconds(cut(20, 22));
	} else {
		date.setMilliseconds(0);
	}
	return date;
}

/**
 * 滚动条在Y轴上的滚动距离
 */
function scrollTop() {
	let bodyScrollTop = 0, documentScrollTop = 0;　　
	if(document.body) {　　　　
		bodyScrollTop = document.body.scrollTop;　　
	}　　
	if(document.documentElement) {　　　　
		documentScrollTop = document.documentElement.scrollTop;　　
	}　　
	return bodyScrollTop > documentScrollTop ? bodyScrollTop : documentScrollTop;
}

/**
 * 浏览器视口的高度
 */
function clientHeight() {　　
	return document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight;
}

/**
 * 文档的总高度
 */
function scrollHeight() {
	let bodyScrollHeight = 0, documentScrollHeight = 0;　　
	if(document.body) {　　　　
		bodyScrollHeight = document.body.scrollHeight;　　
	}　　
	if(document.documentElement) {　　　　
		documentScrollHeight = document.documentElement.scrollHeight;　　
	}　　
	return bodyScrollHeight > documentScrollHeight ? bodyScrollHeight : documentScrollHeight;
}

/**
 * 是否在顶部
 */
function isTop() {
	return scrollTop() === 0;
}

/**
 * 浏览器底部判断
 * @param {Number} offset 偏移值
 */
function isBottom(offset) {
	offset = offset || 0;
	return scrollTop() + clientHeight() + offset >= scrollHeight();
}

/**
 * 获取浏览器视窗宽度
 */
function clientWidth() {
	return document.body.clientWidth;
}

/**
 * 获取浏览器视窗高度(包括边线的宽)
 */
function offsetHeight() {
	return document.body.offsetHeight;
}

/**
 * 获取浏览器视窗宽度(包括边线的宽)
 */
function offsetWidth() {
	return document.body.offsetWidth;
}

/**
 * 移动设备判断
 */
function isMobile() {
	var sUserAgent = navigator.userAgent.toLowerCase();
	var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
	var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
	var bIsMidp = sUserAgent.match(/midp/i) == "midp";
	var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
	var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
	var bIsAndroid = sUserAgent.match(/android/i) == "android";
	var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
	var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
	if(bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM)
		return true;
	return false;
}

/**
 * 关闭窗口
 */
function closeWindow() {
	if(navigator.userAgent.indexOf('Firefox') != -1 || navigator.userAgent.indexOf('Chrome') != -1) {
		window.location.href = 'about:blank';
		window.close();
	} else {
		window.opener = null;
		window.open('', '_self');
		window.close();
	}
}

function sameObj(o1, o2) {
	return toJson(o1) === toJson(o2);
}

function isMobilePhone(str) {
	if(/^1[3|4|5|7|8][0-9]\d{8}$/.test(str)){ 
    	return true;
    }
	return false;
}

function startWith(src, str) {
	if(!str || !str || str.length > src.length) {
		return false;
	}
	if(src.substring(0, str.length) == str) {
		return true;
	} else {
		return false;
	}
}

function endWith(src, str) {
	if(!str || !str || str.length > src.length) {
		return false;
	}
	if(src.substring(src.length - str.length) == s) {
		return true;
	} else {
		return false;
	}
}

function contains(array, tar, absoluteEq) {
	if(array && array.length > 0) {
		for(let i = 0; i < array.length; i ++) {
			if((!absoluteEq && array[i] == tar) || array[i] === tar) {
				return true;
			}
		}
	}
	return false;
}

function base64ToBlob(dataURI, type) {
    let binary = atob(dataURI.split(',')[1]);
    let array = [];
    for(let i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {
        type: type
    });
}

/**
 * HTML转义
 *
 * @param {Object} html
 */
function htmlEncode(html) { 
	if (!html)
		return html;
    var temp = document.createElement ("div"); 
    (temp.textContent != null) ? (temp.textContent = html) : (temp.innerText = html); 
    var output = temp.innerHTML; 
    temp = null; 
    return output; 
} 

/**
 * HTML反转义
 *
 * @param {Object} text
 */
function htmlDecode(text) {
	if (!text)
		return text;
    var temp = document.createElement("div"); 
    temp.innerHTML = text; 
    var output = temp.innerText || temp.textContent; 
    temp = null; 
    return output; 
} 

// 会出现死循环异常
//let htmlFormat = (function() {
//	function style_html(html_source, indent_size, indent_character, max_char) {
//		
//		function Parser() {
//
//			this.pos = 0;
//			this.token = '';
//			this.current_mode = 'CONTENT';
//			this.tags = {
//				parent: 'parent1',
//				parentcount: 1,
//				parent1: ''
//			};
//			this.tag_type = '';
//			this.token_text = this.last_token = this.last_text = this.token_type = '';
//
//			this.Utils = {
//				whitespace: "\n\r\t ".split(''),
//				single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed'.split(','),
//				extra_liners: 'head,body,/html'.split(','),
//				in_array: function(what, arr) {
//					for(let i = 0; i < arr.length; i++) {
//						if(what === arr[i]) {
//							return true;
//						}
//					}
//					return false;
//				}
//			}
//
//			this.get_content = function() {
//				let char = '';
//				let content = [];
//				let space = false;
//				while(this.input.charAt(this.pos) !== '<') {
//					if(this.pos >= this.input.length) {
//						return content.length ? content.join('') : ['', 'TK_EOF'];
//					}
//
//					char = this.input.charAt(this.pos);
//					this.pos++;
//					this.line_char_count++;
//
//					if(this.Utils.in_array(char, this.Utils.whitespace)) {
//						if(content.length) {
//							space = true;
//						}
//						this.line_char_count--;
//						continue;
//					} else if(space) {
//						if(this.line_char_count >= this.max_char) {
//							content.push('\n');
//							for(let i = 0; i < this.indent_level; i++) {
//								content.push(this.indent_string);
//							}
//							this.line_char_count = 0;
//						} else {
//							content.push(' ');
//							this.line_char_count++;
//						}
//						space = false;
//					}
//					content.push(char);
//				}
//				return content.length ? content.join('') : '';
//			}
//
//			this.get_script = function() {
//				let char = '';
//				let content = [];
//				let reg_match = new RegExp('\<\/script' + '\>', 'igm');
//				reg_match.lastIndex = this.pos;
//				let reg_array = reg_match.exec(this.input);
//				let end_script = reg_array ? reg_array.index : this.input.length;
//				while(this.pos < end_script) {
//					if(this.pos >= this.input.length) {
//						return content.length ? content.join('') : ['', 'TK_EOF'];
//					}
//
//					char = this.input.charAt(this.pos);
//					this.pos++;
//
//					content.push(char);
//				}
//				return content.length ? content.join('') : '';
//			}
//
//			this.record_tag = function(tag) {
//				if(this.tags[tag + 'count']) {
//					this.tags[tag + 'count']++;
//					this.tags[tag + this.tags[tag + 'count']] = this.indent_level;
//				} else {
//					this.tags[tag + 'count'] = 1;
//					this.tags[tag + this.tags[tag + 'count']] = this.indent_level;
//				}
//				this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent;
//				this.tags.parent = tag + this.tags[tag + 'count'];
//			}
//
//			this.retrieve_tag = function(tag) {
//				if(this.tags[tag + 'count']) {
//					let temp_parent = this.tags.parent;
//					while(temp_parent) {
//						if(tag + this.tags[tag + 'count'] === temp_parent) {
//							break;
//						}
//						temp_parent = this.tags[temp_parent + 'parent'];
//					}
//					if(temp_parent) {
//						this.indent_level = this.tags[tag + this.tags[tag + 'count']];
//						this.tags.parent = this.tags[temp_parent + 'parent'];
//					}
//					delete this.tags[tag + this.tags[tag + 'count'] + 'parent'];
//					delete this.tags[tag + this.tags[tag + 'count']];
//					if(this.tags[tag + 'count'] == 1) {
//						delete this.tags[tag + 'count'];
//					} else {
//						this.tags[tag + 'count']--;
//					}
//				}
//			}
//
//			this.get_tag = function() {
//				let char = '';
//				let content = [];
//				let space = false;
//
//				do {
//					if(this.pos >= this.input.length) {
//						return content.length ? content.join('') : ['', 'TK_EOF'];
//					}
//
//					char = this.input.charAt(this.pos);
//					this.pos++;
//					this.line_char_count++;
//
//					if(this.Utils.in_array(char, this.Utils.whitespace)) {
//						space = true;
//						this.line_char_count--;
//						continue;
//					}
//
//					if(char === "'" || char === '"') {
//						if(!content[1] || content[1] !== '!') {
//							char += this.get_unformatted(char);
//							space = true;
//						}
//					}
//
//					if(char === '=') {
//						space = false;
//					}
//
//					if(content.length && content[content.length - 1] !== '=' && char !== '>' && space) {
//						if(this.line_char_count >= this.max_char) {
//							this.print_newline(false, content);
//							this.line_char_count = 0;
//						} else {
//							content.push(' ');
//							this.line_char_count++;
//						}
//						space = false;
//					}
//					content.push(char);
//				} while (char !== '>');
//
//				let tag_complete = content.join('');
//				let tag_index;
//				if(tag_complete.indexOf(' ') != -1) {
//					tag_index = tag_complete.indexOf(' ');
//				} else {
//					tag_index = tag_complete.indexOf('>');
//				}
//				let tag_check = tag_complete.substring(1, tag_index).toLowerCase();
//				if(tag_complete.charAt(tag_complete.length - 2) === '/' || this.Utils.in_array(tag_check, this.Utils.single_token)) {
//					this.tag_type = 'SINGLE';
//				} else if(tag_check === 'script') {
//					this.record_tag(tag_check);
//					this.tag_type = 'SCRIPT';
//				} else if(tag_check === 'style') {
//					this.record_tag(tag_check);
//					this.tag_type = 'STYLE';
//				} else if(tag_check.charAt(0) === '!') {
//					if(tag_check.indexOf('[if') != -1) {
//						if(tag_complete.indexOf('!IE') != -1) {
//							let comment = this.get_unformatted('-->', tag_complete);
//							content.push(comment);
//						}
//						this.tag_type = 'START';
//					} else if(tag_check.indexOf('[endif') != -1) {
//						this.tag_type = 'END';
//						this.unindent();
//					} else if(tag_check.indexOf('[cdata[') != -1) {
//						let comment = this.get_unformatted(']]>', tag_complete);
//						content.push(comment);
//						this.tag_type = 'SINGLE';
//					} else {
//						let comment = this.get_unformatted('-->', tag_complete);
//						content.push(comment);
//						this.tag_type = 'SINGLE';
//					}
//				} else {
//					if(tag_check.charAt(0) === '/') {
//						this.retrieve_tag(tag_check.substring(1));
//						this.tag_type = 'END';
//					} else {
//						this.record_tag(tag_check);
//						this.tag_type = 'START';
//					}
//					if(this.Utils.in_array(tag_check, this.Utils.extra_liners)) {
//						this.print_newline(true, this.output);
//					}
//				}
//				return content.join('');
//			}
//
//			this.get_unformatted = function(delimiter, orig_tag) {
//				if(orig_tag && orig_tag.indexOf(delimiter) != -1) {
//					return '';
//				}
//				let char = '';
//				let content = '';
//				let space = true;
//				do {
//
//					char = this.input.charAt(this.pos);
//					this.pos++
//
//						if(this.Utils.in_array(char, this.Utils.whitespace)) {
//							if(!space) {
//								this.line_char_count--;
//								continue;
//							}
//							if(char === '\n' || char === '\r') {
//								content += '\n';
//								for(let i = 0; i < this.indent_level; i++) {
//									content += this.indent_string;
//								}
//								space = false;
//								this.line_char_count = 0;
//								continue;
//							}
//						}
//					content += char;
//					this.line_char_count++;
//					space = true;
//
//				} while (content.indexOf(delimiter) == -1);
//				return content;
//			}
//
//			this.get_token = function() {
//				let token;
//
//				if(this.last_token === 'TK_TAG_SCRIPT') {
//					let temp_token = this.get_script();
//					if(typeof temp_token !== 'string') {
//						return temp_token;
//					}
//					//token = js_beautify(temp_token, this.indent_size, this.indent_character, this.indent_level);
//					//return [token, 'TK_CONTENT'];
//					return [temp_token, 'TK_CONTENT'];
//				}
//				if(this.current_mode === 'CONTENT') {
//					token = this.get_content();
//					if(typeof token !== 'string') {
//						return token;
//					} else {
//						return [token, 'TK_CONTENT'];
//					}
//				}
//
//				if(this.current_mode === 'TAG') {
//					token = this.get_tag();
//					if(typeof token !== 'string') {
//						return token;
//					} else {
//						let tag_name_type = 'TK_TAG_' + this.tag_type;
//						return [token, tag_name_type];
//					}
//				}
//			}
//
//			this.printer = function(js_source, indent_character, indent_size, max_char) {
//				this.input = js_source || '';
//				this.output = [];
//				this.indent_character = indent_character || ' ';
//				this.indent_string = '';
//				this.indent_size = indent_size || 2;
//				this.indent_level = 0;
//				this.max_char = max_char || 70;
//				this.line_char_count = 0;
//				for(let i = 0; i < this.indent_size; i++) {
//					this.indent_string += this.indent_character;
//				}
//
//				this.print_newline = function(ignore, arr) {
//					this.line_char_count = 0;
//					if(!arr || !arr.length) {
//						return;
//					}
//					if(!ignore) {
//						while(this.Utils.in_array(arr[arr.length - 1], this.Utils.whitespace)) {
//							arr.pop();
//						}
//					}
//					arr.push('\n');
//					for(let i = 0; i < this.indent_level; i++) {
//						arr.push(this.indent_string);
//					}
//				}
//
//				this.print_token = function(text) {
//					this.output.push(text);
//				}
//
//				this.indent = function() {
//					this.indent_level++;
//				}
//
//				this.unindent = function() {
//					if(this.indent_level > 0) {
//						this.indent_level--;
//					}
//				}
//			}
//			return this;
//		}
//
//		let multi_parser = new Parser();
//		multi_parser.printer(html_source, indent_character, indent_size);
//		while(true) {
//			let t = multi_parser.get_token();
//			multi_parser.token_text = t[0];
//			multi_parser.token_type = t[1];
//
//			if(multi_parser.token_type === 'TK_EOF') {
//				break;
//			}
//
//			switch(multi_parser.token_type) {
//				case 'TK_TAG_START':
//				case 'TK_TAG_SCRIPT':
//				case 'TK_TAG_STYLE':
//					multi_parser.print_newline(false, multi_parser.output);
//					multi_parser.print_token(multi_parser.token_text);
//					multi_parser.indent();
//					multi_parser.current_mode = 'CONTENT';
//					break;
//				case 'TK_TAG_END':
//					multi_parser.print_newline(true, multi_parser.output);
//					multi_parser.print_token(multi_parser.token_text);
//					multi_parser.current_mode = 'CONTENT';
//					break;
//				case 'TK_TAG_SINGLE':
//					multi_parser.print_newline(false, multi_parser.output);
//					multi_parser.print_token(multi_parser.token_text);
//					multi_parser.current_mode = 'CONTENT';
//					break;
//				case 'TK_CONTENT':
//					if(multi_parser.token_text !== '') {
//						multi_parser.print_newline(false, multi_parser.output);
//						multi_parser.print_token(multi_parser.token_text);
//					}
//					multi_parser.current_mode = 'TAG';
//					break;
//			}
//			multi_parser.last_token = multi_parser.token_type;
//			multi_parser.last_text = multi_parser.token_text;
//		}
//		return multi_parser.output.join('');
//	}
//
//	return function(data) {
//		let dataHolder = ['__dataHolder_', [Math.random(), Math.random(), Math.random(), Math.random()].join('_').replace(/[^0-9]/g, '_'), '_'].join('_');
//		let dataHolders = {};
//		let index = 0;
//		data = data.replace(/(\")(data:[^\"]*)(\")/g, function($0, $1, $2, $3) {
//			let name = dataHolder + index++;
//			dataHolders[name] = $2;
//			return $1 + name + $3;
//		})
//		data = style_html(data, 1, '\t', 0x10000000);
//		data = data.replace(new RegExp(dataHolder + '[0-9]+', 'g'), function($0) {
//			return dataHolders[$0];
//		});
//
//		return data;
//	}
//})();

export {
	serialize,
	deserialize,
	clone,
	merge,
	ref,
	equals,
	toJson,
	fromJson,
	trim,
	trimHtmlTag,
	gcd,
	dtf,
	dateFormat,
	toDate,
	scrollTop,
	scrollHeight,
	isTop,
	isBottom,
	clientHeight,
	clientWidth,
	offsetHeight,
	isMobile,
	closeWindow,
	sameObj,
	isMobilePhone,
	startWith,
	endWith,
	contains,
	base64ToBlob,
	htmlEncode,
	htmlDecode,
//	htmlFormat,
};